import {read} from 'xlsx';

/**
 * 处理 Excel 文件上传并解析数据
 * @param file
 * @param callback
 */
export const handleFileUpload = (file: File, callback: (data: any[]) => void) => {
  // 获取用户选择的文件
  // const file = event.target.files[0];
  // 创建一个 FileReader 对象，用于读取文件内容
  const reader = new FileReader();
  // 当文件读取完成时触发的回调函数
  reader.onload = (e) => {
    // 将文件内容转换为 Uint8Array 类型
    const data = new Uint8Array(e.target.result as ArrayBuffer);
    // 使用 xlsx 库解析文件内容
    const workbook = read(data, {type: 'array'});

    // 用于存储解析后的 Excel 数据
    const excelData = [];
    // 用于记录已经录入的数据，避免重复录入
    let entered_list: any[] = [];
    // 获取第一个工作表
    const worksheet = workbook.Sheets[workbook.SheetNames[0]];

    // 遍历工作表中的每个单元格
    for (let key in worksheet){
      // 获取单元格的列字母（如 A、B、C 等）
      const serial = key.charAt(0);
      // 获取单元格的行号
      const number = Number(key.split(key.charAt(0))[1]);
      // 获取当前单元格同一行的另一行的单元格键名
      const keyNegation = (serial === 'A' ? 'B' : 'A')
        + number
      // 获取上一行同一列的单元格键名
      const keyNegationPrevious = (serial === 'A' ? 'B' : 'A')
        + (number - 1);

      // 过滤掉表头和无效的行
      if (typeof number === 'number' && !Number.isNaN(number)
        && number !== 1) {
        // 若同一行的另一列的单元格为空，则用前一行对应的列的值填充
        if (!worksheet.hasOwnProperty(keyNegation)) {
          worksheet[keyNegation] = {
            v: worksheet[keyNegationPrevious].v
          };
        }

        // 避免重复录入相同的数据
        if (entered_list.indexOf(key) < 0 && entered_list.
        indexOf(keyNegation) < 0) {
          // 记录当前单元格已被处理
          entered_list.push(key);
          // 将解析后的数据添加到 excelData 数组中
          excelData.push({
            serialNumber: worksheet[key].v,
            // productName: worksheet[keyNegation].v,
            number: worksheet[keyNegation].v,
          });
        }
      }
    }
    // 调用回调函数，将解析后的数据传递出去
    callback(excelData)
  };
  reader.readAsArrayBuffer(file);
}